package com.rain.manager;

import com.netflix.zuul.ZuulFilter;
import com.netflix.zuul.context.RequestContext;
import com.netflix.zuul.exception.ZuulException;
import org.springframework.util.StringUtils;

import javax.servlet.http.HttpServletRequest;

/**
 * @auther 德哲
 * @date 2019/5/6 9:23.
 */
public class ManagerFilter extends ZuulFilter {

    /**
     * 过滤器的执行时机
     * @return
     */
    @Override
    public String filterType() {
        return "pre";
    }

    /**
     * 过滤器的优先级
     * @return
     */
    @Override
    public int filterOrder() {
        return 0;
    }

    /**
     * 过滤器是否执行
     * @return
     */
    @Override
    public boolean shouldFilter() {
        return true;
    }

    /**
     * 过滤器的核心方法
     * @return
     * @throws ZuulException
     */
    @Override
    public Object run() throws ZuulException {

        RequestContext requestContext = RequestContext.getCurrentContext();

        HttpServletRequest request = requestContext.getRequest();

        String authorization = request.getHeader("Authorization");

        //特殊操作：处理跨域操作，跨域操作都有两次请求，
        //第一次请求：预请求，此时不携带任何信息，它的请求方式是固定的 options
        //第二次请求才是正式的请求，它的请求方式是由具体的功能和RESTURL决定的，并且会携带数据：请求正文，请求消息头
        String method = request.getMethod();
        if (method.equalsIgnoreCase("OPTIONS")){
            //表示跨越域的预请求，无须验证消息头
            System.out.println("跨越请求的第一次预请求，过滤器直接放行");
            return null;
        }

        //特殊操作，登录时不需要消息头，登录时才会签发token
        //取出请求的url
        String uri = request.getRequestURI();

        if (uri.indexOf("/admin/login") > 0 ){
            System.out.println("登录操作，过滤器直接放行");
            return null;
        }

        if (!StringUtils.isEmpty(authorization) && authorization.startsWith("Bearer ")){

            requestContext.addZuulRequestHeader("Authorization",authorization);

            return null;
        }

        requestContext.setSendZuulResponse(false); //程序不在继续请求（不再请求微服务）  true继续执行，false不继续执行

        requestContext.setResponseStatusCode(401);

        requestContext.setResponseBody("没有权限");

        requestContext.getResponse().setContentType("text/html;charset=UTF-8");

        return null;
    }
}
